//package com.cebbank.sz.cebtemplate.utils;
//
//import io.micrometer.core.instrument.util.StringUtils;
//import org.dom4j.*;
//
//import java.util.*;
//
///**
// * xml的xpath解析工具类
// *
// * @author jaco
// * @create 2019-12-07 上午12:12
// **/
//public class XPathParserUtils {
//
//    private static final String HIPMSR = "HIPMessageServerResult";
//
//    private static final String[] LIST_TAG = {
//            "row",
//            "recipe"
//    };
//
//    /**
//     * 自定义item是否存在
//     * @param item
//     * @return
//     */
//    private static boolean checkIsInArray(String item) {
//        List<String> list = Arrays.asList(LIST_TAG);
//        return list.contains(item);
//    }
//
//    /**
//     * @param
//     * @return
//     * @throws
//     * @Description: 将字符串转化为文档
//     * @author Jaco
//     * @date 19-12-7 上午1:03
//     */
//    private static Document convertFromString(String text) throws DocumentException {
//        return DocumentHelper.parseText(text);
//    }
//
//    /**
//     * @param
//     * @return
//     * @throws
//     * @Description: 1. 选取root节点
//     * 2. 传入节点，分析root的子节点
//     * 3. 遍历所有子节点
//     * 4. 分析单个子节点，子节点是否有孙子节点，如果没有则将单个节点放入map，如果有则将孙子节点作为参数传入函数 进入步骤1
//     * 5. 如果子节点中有列表（孙子节点名称都是item） 则将子节点的name为Key 用列表分析函数返回list作为值 放入Map
//     * @author Jaco
//     * @date 19-12-7 上午1:04
//     */
//    private static Map<String, Object> parseNode2Map(Node node) {
//        Map<String, Object> resultMap = new HashMap<>(16);
//
//        List<Node> nodes = node.selectNodes("child::*");
//        // 如果有子节点
//        if (nodes != null && !nodes.isEmpty()) {
//            // 遍历所有子节点
//            for (int i = 0; i < nodes.size(); i++) {
//                Node sonNode = nodes.get(i);
//                // 如果子节点是item
//                if (checkIsInArray(sonNode.getName())) {
//                    // 处理列表函数f(node)
//                    List tempList = parseItem2List(nodes);
//                    String key = node.getName();
//                    resultMap.put(key, tempList);
//                } else {
//                    Map<String, Object> tempMap = parseNode2Map(sonNode);
//                    if (tempMap != null && !tempMap.isEmpty()) {
//                        resultMap.putAll(tempMap);
//                    }
//                }
//            }
//
//        } else {
//            // 没有子节点
//            insertLeafNode2Map(resultMap, node);
//        }
//
//        return resultMap;
//    }
//
//    /**
//     * @param
//     * @return
//     * @throws
//     * @Description: 将叶子节点信息插入Map
//     * @author Jaco
//     * @date 19-12-7 下午4:06
//     */
//    private static void insertLeafNode2Map(Map<String, Object> map, Node node) {
//        String name = node.getName();
//        String value = node.getStringValue();
//        if (StringUtils.isNotBlank(name)) {
//            map.put(name, value);
//        }
//    }
//
//    private static List parseItem2List(List<Node> nodes) {
//        List<Object> resultList = new ArrayList<>();
//        for (Node sonNode : nodes) {
//            if (checkIsInArray(sonNode.getName())) {
//                List<Node> grandsonNodes = sonNode.selectNodes("child::*");
//                Map<String, Object> tempMap = new HashMap<>(16);
//                for (Node grandsonNode : grandsonNodes) {
//                    Map<String, Object> singleNodeMap = parseNode2Map(grandsonNode);
//                    tempMap.putAll(singleNodeMap);
//                }
//                resultList.add(tempMap);
//            }
//        }
//        return resultList;
//    }
//
//    private static Map<String, Object> parse(String soap) throws DocumentException{
//        Map<String, Object> map = new HashMap<>(16);
//        // 报文转成doc对象
//        Document doc = DocumentHelper.parseText(soap);
//        // 获取根元素，准备递归解析这个XML树
//        Element root = doc.getRootElement();
//        getElements(root, map);
//        return map;
//    }
//
//    private static void getElements(Element root, Map<String, Object> map){
//        if(root.elements() != null){
//            // 如果当前跟节点有子节点，找到子节点
//            List<Element>list = root.elements();
//            // 遍历每个节点
//            for(Element e:list){
//                if(e.elements().size()>0){
//                    // 当前节点不为空的话，递归遍历子节点
//                    getElements(e, map);
//                }else{
//                    // 如果为叶子节点，那么直接把名字和值放入map
//                    map.put(e.getName(), e.getTextTrim());
//                }
//            }
//        }
//    }
//
//    /**
//     * 1. 选取root节点
//     * 2. 传入节点，分析root的子节点
//     * 3. 遍历所有子节点
//     * 4. 分析单个子节点，子节点是否有孙子节点，如果没有则将单个节点放入map，如果有则将子节点作为参数传入函数 进入步骤1
//     * 5. 如果子节点中有列表（孙子节点名称都是item） 则将子节点的name为Key 用列表分析函数返回list作为值 放入Map
//     */
//    public static Map<String, Object> getMapFromXmlStr(String xmlStr) {
//        Map<String, Object> map = new HashMap<>(16);
//        try {
//            Map<String, Object> xmlMap = parse(xmlStr);
//            if (null != xmlMap.get(HIPMSR)) {
//                String hipMessageServerResult = xmlMap.get(HIPMSR).toString();
//                hipMessageServerResult = hipMessageServerResult.replaceAll("<patient>","").replaceAll("</patient>","");
//                Document document = convertFromString(hipMessageServerResult);
//                map = XPathParserUtils.parseNode2Map(document.getRootElement());
//            }
//        } catch (DocumentException e) {
//            e.printStackTrace();
//        }
//        return map;
//    }
//
//    public static void main(String[] args) {
//        String soapString ="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" +
//                "<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:s='http://www.w3.org/2001/XMLSchema'>" +
//                "<SOAP-ENV:Body><HIPMessageServerResponse xmlns=\"http://tempuri.org\"><HIPMessageServerResult><![CDATA[<Response><code>0</code><message>成功</message><transactionNo>21121</transactionNo><patient><name></name><Sex>女</Sex><age>10</age><birthday>2010-05-03</birthday></patient><List><row><emrId>3</emrId><hospitalName>江苏科技城医院</hospitalName><patientId></patientId><clinicNo>3</clinicNo><departmentId>010799</departmentId><departmentName>EKMZ-儿科门诊</departmentName><doctorId>P0080</doctorId><doctorName>徐虹</doctorName><clinicTime>2016-05-16 08:39:40</clinicTime><clinicType>O</clinicType><supplier></supplier><chief></chief><presentIllness></presentIllness><pastIllness></pastIllness><healthCheckup></healthCheckup><examCheckup></examCheckup><primaryDiagnosisList><observation><status>确诊</status><type></type><consequence>急性支气管炎</consequence><code>J20.900</code></observation></primaryDiagnosisList><disposeList><dispose><type>诊察</type><Drugname>普通门诊诊察费</Drugname><charge_unit></charge_unit><UsageName></UsageName><FrequName></FrequName><usage></usage><remark></remark><Specification></Specification></dispose><dispose><type>化验</type><Drugname>血常规+CRP</Drugname><charge_unit></charge_unit><UsageName></UsageName><FrequName></FrequName><usage></usage><remark></remark><Specification></Specification></dispose><dispose><type>检查</type><Drugname>X线检查[小儿胸片]</Drugname><charge_unit></charge_unit><UsageName></UsageName><FrequName></FrequName><usage></usage><remark></remark><Specification></Specification></dispose><dispose><type>化验</type><Drugname>生化全套</Drugname><charge_unit></charge_unit><UsageName></UsageName><FrequName></FrequName><usage></usage><remark></remark><Specification></Specification></dispose><dispose><type>治疗</type><Drugname>静脉采血</Drugname><charge_unit></charge_unit><UsageName></UsageName><FrequName></FrequName><usage></usage><remark></remark><Specification></Specification></dispose><dispose><type>化验</type><Drugname>性激素六项</Drugname><charge_unit></charge_unit><UsageName></UsageName><FrequName></FrequName><usage></usage><remark></remark><Specification></Specification></dispose><dispose><type>治疗</type><Drugname>静脉采血</Drugname><charge_unit></charge_unit><UsageName></UsageName><FrequName></FrequName><usage></usage><remark></remark><Specification></Specification></dispose><dispose><type>西药</type><Drugname>阿莫西林胶囊(阿莫仙)[0.25g×24粒][香港联邦]</Drugname><charge_unit>g</charge_unit><UsageName></UsageName><FrequName>每日2次</FrequName><usage>0.25</usage><remark></remark><Specification>0.25g×24粒</Specification></dispose><dispose><type>西药</type><Drugname>注射用五水头孢唑林钠(新泰林)[1.0g][深圳]</Drugname><charge_unit>g</charge_unit><UsageName></UsageName><FrequName>每日1次</FrequName><usage>1</usage><remark></remark><Specification>1.0g</Specification></dispose><dispose><type>西药</type><Drugname>5%葡萄糖注射液[100ml:5g][中国大冢]</Drugname><charge_unit>ml</charge_unit><UsageName></UsageName><FrequName>每日1次</FrequName><usage>100</usage><remark></remark><Specification>100ml:5g</Specification></dispose><dispose><type>治疗</type><Drugname>静脉输液</Drugname><charge_unit></charge_unit><UsageName></UsageName><FrequName></FrequName><usage></usage><remark></remark><Specification></Specification></dispose><dispose><type>西药</type><Drugname>维生素K1注射液[1ml:10mg][上海现代哈森(商丘)]</Drugname><charge_unit>mg</charge_unit><UsageName></UsageName><FrequName>每日1次</FrequName><usage>10</usage><remark></remark><Specification>1ml:10mg</Specification></dispose><dispose><type>治疗</type><Drugname>肌肉注射</Drugname><charge_unit></charge_unit><UsageName></UsageName><FrequName></FrequName><usage></usage><remark></remark><Specification></Specification></dispose></disposeList><remark></remark><advice></advice></row></List></Response>]]></HIPMessageServerResult></HIPMessageServerResponse></SOAP-ENV:Body>" +
//                "</SOAP-ENV:Envelope>";
//
//        String recipeStr = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" +
//                "<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:s='http://www.w3.org/2001/XMLSchema'>" +
//                "<SOAP-ENV:Body><HIPMessageServerResponse xmlns=\"http://tempuri.org\"><HIPMessageServerResult><![CDATA[<Response><code>0</code><message>成功</message><transactionNo>21121</transactionNo><patient><name></name><sex>女</sex><age>10</age><birthday>2010-03-18</birthday></patient><List><row><hospitalName>江苏科技城医院</hospitalName><patientId></patientId><clinicNo>3</clinicNo><mjzFlag>MZ</mjzFlag><departmentId>010799</departmentId><departmentName>EKMZ-儿科门诊</departmentName><doctorId>P0080</doctorId><doctorName>徐虹</doctorName><clinicTime>2016-05-16 08:39:40</clinicTime><List><recipe><name>阿莫西林胶囊(阿莫仙)[0.25g×24粒][香港联邦]</name><specification>0.25g×24粒</specification><usageName>口服</usageName><dosage>0.25</dosage><dosageUnit>g</dosageUnit><quantity>1</quantity><herbalNum></herbalNum><useDays>1天</useDays><frequName>每日2次</frequName><status></status></recipe><recipe><name>注射用五水头孢唑林钠(新泰林)[1.0g][深圳]</name><specification>1.0g</specification><usageName>静脉滴注</usageName><dosage>1</dosage><dosageUnit>g</dosageUnit><quantity>1</quantity><herbalNum></herbalNum><useDays>1天</useDays><frequName>每日1次</frequName><status></status></recipe><recipe><name>5%葡萄糖注射液[100ml:5g][中国大冢]</name><specification>100ml:5g</specification><usageName>静脉滴注</usageName><dosage>100</dosage><dosageUnit>ml</dosageUnit><quantity>1</quantity><herbalNum></herbalNum><useDays>1天</useDays><frequName>每日1次</frequName><status></status></recipe><recipe><name>维生素K1注射液[1ml:10mg][上海现代哈森(商丘)]</name><specification>1ml:10mg</specification><usageName>肌肉注射</usageName><dosage>10</dosage><dosageUnit>mg</dosageUnit><quantity>1</quantity><herbalNum></herbalNum><useDays>1天</useDays><frequName>每日1次</frequName><status></status></recipe></List></row></List></Response>]]></HIPMessageServerResult></HIPMessageServerResponse></SOAP-ENV:Body>" +
//                "</SOAP-ENV:Envelope>";
//
//        Map<String, Object> map = getMapFromXmlStr(recipeStr);
//        System.out.println(map.toString());
//    }
//
//}